class BookViewModel(object):
    ''' 在编程里处理很多事件,都有相同的逻辑,比如处理从数据源查出来的数据
        先处理单一数据对象, 在根据单一处理结果,处理多数据对象
        好处: 代码可读性极高,维护成本很低, 改动频率会减少
        缺点: 代码量相对来说会增多'''
    def __init__(self, book):
        self.title = book['title']
        self.publisher = book['publisher']
        self.pages = book['pages']
        self.author = '-'.join(book['author'])
        self.price = book['price']
        self.summary = book['summary']
        self.image = book['image']
        self.isbn = book['isbn']
        self.pubdate = book['pubdate']
        self.binding = book['binding']

    @property
    def intro(self):
        ''' 当前方法就是一个函数式编程的demo
            需求: 把可能为空的值进行判断过滤,只保存有值的数据,可以在jinjia中使用
            filter函数的作用: 对于元素进行过滤,把所有返回True的元素进行保存,得到一个新列表'''
        intros = filter(lambda x: True if x else False,
                       [self.author, self.publisher, self.price])

        return '/'.join(intros)


class BookCollection(object):
    ''' 把需要返回的数据当做属性保存在__init__中,把对于数据处理的代码当做类的方法
        这样一个基本的面向对象逻辑就实现了
        重点:一个类中存在它的特征和行为才算的上是一个基本的面向对象,只有方法没有特征,就只是个披着class外衣的面向过程.'''
    def __init__(self):
        self.total = 0
        self.keyword = ''
        self.books = []

    def fill(self, yushu_book, keyword):
        self.total = yushu_book.total
        self.keyword = keyword
        # 面向对象的方式构造数据,view_model层
        self.books = [BookViewModel(book) for book in yushu_book.books]


class __BookViewModel():
    ''' 此类就是一个披着class外衣的面向过程 '''
    @classmethod
    def package_single(cls, data, keyword):
        ret = {
            'books': [],
            'total': 0,
            'keyword': keyword
        }
        if data:
            ret['total'] = 1
            # 构造数据
            ret['books'] = [cls.__structure_book_data(data)]
        return ret

    @classmethod
    def package_collection(cls, data, keyword):
        ret = {
            'books':[],
            'total':0, # 总条数
            'keyword': keyword
        }
        if data:
            # 记录总数
            ret['total'] = data['total']
            # 构造数据
            ret['books'] = [cls.__structure_book_data(book) for book in data['books']]
        return ret

    @classmethod
    def __structure_book_data(cls, data):
        book = {
            'title': data['title'],
            'publisher': data['publisher'],
            'pages': data['pages'] or '',
            'author': '-'.join(data['author']),
            'price': data['price'],
            'summary': data['summary'] or '',
            'image': data['image']
        }
        return book